#导入Pin模块
from machine import Pin
import time
import tm1637
from neopixel import NeoPixel


led_pin=[15,2,0,4,16,17,5,18]  #定义LED控制引脚
leds=[]  #定义leds列表，保存LED管脚配置对象
for i in range(8):  #循环8次，0-7
    leds.append(Pin(led_pin[i],Pin.OUT))  #给leds列表添加对象

#定义蜂鸣器控制对象
beep=Pin(12,Pin.OUT)

#定义继电器控制对象
relay=Pin(14,Pin.OUT)

#定义数码管控制对象
smg=tm1637.TM1637(clk=Pin(27),dio=Pin(26))

#定义RGB控制对象
rgb_led=NeoPixel(Pin(25,Pin.OUT),5)

#定义IRED控制对象
ired=Pin(33,Pin.IN,Pin.PULL_UP)
#存储红外遥控器键值
gired_data=[0,0,0,0]

#外部中断函数
def ired_irq(ired):
    ired_high_time=0  #保存高电平时间，鉴别数据1还是0
    
    if ired.value()==0:
        time_cnt=1000
        while (not ired.value()) and time_cnt:  #等待引导信号9ms低电平结束，若超过10ms强制退出
            time.sleep_us(10)
            time_cnt-=1
            if time_cnt==0:
                return
        
        if ired.value()==1:  #引导信号9ms低电平已过，进入4.5ms高电平
            time_cnt=500
            while ired.value() and time_cnt:  #等待引导信号4.5ms高电平结束，若超过5ms强制退出
                time.sleep_us(10)
                time_cnt-=1
                if time_cnt==0:
                    return
            for i in range(4):  #循环4次，读取4个字节数据
                for j in range(8):  #循环8次读取每位数据即一个字节
                    time_cnt=600
                    while (ired.value()==0) and time_cnt:  #等待数据1或0前面的0.56ms结束，若超过6ms强制退出
                        time.sleep_us(10)
                        time_cnt-=1
                        if time_cnt==0:
                            return
                    time_cnt=20
                    while ired.value()==1:  #等待数据1或0后面的高电平结束，若超过2ms强制退出
                        time.sleep_us(100)
                        ired_high_time+=1
                        if ired_high_time>20:
                            return
                    gired_data[i]>>=1  #先读取的为低位，然后是高位
                    if ired_high_time>=8:  #如果高电平时间大于0.8ms，数据则为1，否则为0
                        gired_data[i]|=0x80
                    ired_high_time=0  #重新清零，等待下一次计算时间
        if gired_data[2]!=~gired_data[3]:  #校验控制码与反码，错误则返回
            for i in range(4):
                gired_data[i]=0
                return
    smg.hex(gired_data[2])         
    print("红外遥控器操作码：0x%02X" % gired_data[2])
    

#蜂鸣器测试
def beep_test():
    i=0
    sta=0
    while i<200:
        sta=not sta
        beep.value(sta)
        time.sleep_us(250)
        i+=1

#继电器测试
def relay_test():
    relay.value(1)
    time.sleep(0.5)
    relay.value(0)
    
#流水灯测试
def led_flow_test():
    cnt=0
    for n in range(8):
        leds[n].value(1)
    time.sleep(1)
    for n in range(8):
        leds[n].value(0)
    while cnt<2:
        #LED逐个点亮
        for n in range(8):
            if n>0:
               leds[n-1].value(0)   
            leds[n].value(1)
            time.sleep(0.2)
        leds[n].value(0)
        cnt+=1
        
#数码管测试
def smg_show_test():
    smg.show("8888")
    time.sleep(1)
    smg.show("1314")  #字符串显示，显示整数

#红外遥控测试
def ired_test():
    ired.irq(ired_irq,Pin.IRQ_FALLING)

#定义RGB颜色
RED = (255, 0, 0)
ORANGE = (255, 165, 0)
YELLOW = (255, 150, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
INDIGO = (75, 0, 130)
VIOLET = (138, 43, 226)
COLORS = (RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET)
#RGB彩灯测试
def rgb_test():
    cnt=0
    while cnt<1:
        for color in COLORS:
            for i in range(5):
                rgb_led[i]=(color[0], color[1], color[2])
                rgb_led.write()
                time.sleep_ms(100)
            time.sleep_ms(100)
        cnt+=1
    for i in range(5):
        rgb_led[i]=(0, 0, 0)
        rgb_led.write()

#程序入口
if __name__=="__main__":
    beep_test()
    relay_test()
    smg_show_test()
    led_flow_test()
    ired_test()
    rgb_test()
        
    